from socket import *
from threading import Thread

def recv_data():
    """接收数据"""
    while True:
        
        # 接收数据 -- 返回信息、(客户端IP、客户端的端口号)
        recv_data = s.recvfrom(1024)  # 1024表示本次接收的最大字节数
        
        # 获取信息
        recv_content = recv_data[0].decode('gbk')
        
        print(f"收到远程信息:{recv_content},from {recv_data[1]}")
        
        # 如果接收到的是 88，则停止接收信息
        if recv_content == "88":
            print("结束聊天！")
            break
            
            
def send_data():
    """发送数据"""
    addr = ("127.0.0.1", # 绑定对方的IP
            9999) # 要发送到的端口
    
    while True:
        data = input("请输入：\n")
        
        # 发送数据
        s.sendto(data.encode("gbk"), addr)
        
        # 如果发送的信息是 88，则不再发送
        if data == "88":
            print("结束聊天！")
            break

if __name__ == '__main__':
    # 创建UDP类型的套接字
    s = socket(AF_INET, SOCK_DGRAM)  
    
    # 绑定接收信息的端口, ip可以不写（就是本机的IP）
    s.bind(("127.0.0.1", 8888)) 
    
    # 创建两个线程 -- 一个负责接收信息，一个负责发送信息
    t1 = Thread(target=recv_data)
    t2 = Thread(target=send_data)
    
    # 启动线程
    t1.start()
    t2.start()
    
    # 子线程不结束，主线程也不结束
    t1.join()
    t2.join()